import pymysql
from config import DBSql


class DBUtil(object):
    conn = None  # 存储数据库连接

    @classmethod
    def __get_conn(cls):
        """获取数据库连接，并返回"""
        if cls.conn is None:
            cls.conn = pymysql.connect(host=DBSql.HOST, port=DBSql.PORT, user=DBSql.USER,
                                       password=DBSql.PASSWORD, database=DBSql.DATABASE, charset=DBSql.CHARSET)
        return cls.conn

    @classmethod
    def __close_conn(cls):
        if cls.conn:
            cls.conn.close()
            cls.conn = None

    @classmethod
    def select1(cls, sql):
        cursor = None
        result = None
        try:
            # 创建数据库连接
            conn = cls.__get_conn()
            # 获取游标
            cursor = conn.cursor()
            # 执行sql
            cursor.execute(sql)
            # 保存执行结果的第一条 fetchone()
            result = cursor.fetchone()
        except Exception as e:
            print(e)
            raise e
        finally:
            # 关闭游标
            if cursor:
                cursor.close()
            # 关闭数据库连接
            cls.__close_conn()
            return result

    """
    1. 实现步骤：创建数据库连接->获取游标->游标执行sql->提交事务->关闭游标->关闭数据库连接对象
       - sql通过参数传入
       - 创建数据库连接和关闭数据库连接，调用已封装好的方法
       - 游标-使用局部变量实现
    2. 添加异常捕获代码try...except...finally...
       - 确认要捕获的代码
       - 捕获到异常的代码
         - 打印异常信息
         - 回滚
       - 确认无论成功或失败都要执行的代码
         - 关闭游标
         - 关闭数据库连接
         - 局部变量：游标
    """

    @classmethod
    def uid_db(cls, sql):
        cursor = None
        try:
            # 创建数据库连接
            conn = cls.__get_conn()
            # 获取游标
            cursor = conn.cursor()
            # 执行sql，提交事务
            cursor.execute(sql)
            # 提交事务
            conn.commit()
        except Exception as e:
            print(e)
            # 事务回滚
            if cls.conn:
                cls.conn.rollback()
            raise e
        finally:
            # 关闭游标
            if cursor:
                cursor.close()
            # 关闭数据库连接
            cls.__close_conn()


if __name__ == '__main__':
    print(DBUtil.select1("select * from t_book;"))